import { _decorator, Component, instantiate, Node, Prefab } from 'cc';
import { EnemyManager } from './EnemyManager'; // 导入 EnemyManager 脚本
const { ccclass, property } = _decorator;

@ccclass('LevelManager')
export class LevelManager extends Component {
    @property(Prefab)
    private enemyPrefab_0: Prefab | null = null; // 敌人类型0的预制体
    @property(Prefab)
    private enemyPrefab_1: Prefab | null = null; // 敌人类型1的预制体
    @property(Prefab)
    private enemyPrefab_2: Prefab | null = null; // 敌人类型2的预制体
    @property(Prefab)
    private enemyPrefab_3: Prefab | null = null; // 敌人类型3的预制体
    @property(Prefab)
    private enemyPrefab_4: Prefab | null = null; // 敌人类型4的预制体
    // ... 根据需要继续添加其他敌人类型的预制体

    start() {
        this.initLevel();
    }
    loadLevelData(levelKey: string): Array<{ x: number, y: number, type: string }> {
        // 这里只是一个示例，您需要根据实际情况实现数据的加载
        const levelData: Record<string, Array<{ x: number, y: number, type: string }>> = {
            'level1': [//敌人类型：enemyPrefab_0生成位置：在屏幕底部随机位置
                { x: -260, y: 950, type: 'enemyPrefab_0' },
                { x: 260, y: 950, type: 'enemyPrefab_0' }
            ],
            'level2': [//敌人类型：enemyPrefab_1 和 enemyPrefab_2生成位置：屏幕底部和顶部随机位置
                { x: -260, y: 950, type: 'enemyPrefab_1' },
                { x: 0, y: 850, type: 'enemyPrefab_2' },
                { x: 260, y: 950, type: 'enemyPrefab_1' }
            ],
            'level3': [//敌人类型：enemyPrefab_3 和 enemyPrefab_4生成位置：屏幕四个角落随机位置
                { x: -260, y: 850, type: 'enemyPrefab_3' },
                { x: -260, y: 950, type: 'enemyPrefab_4' },
                { x: 260, y: 850, type: 'enemyPrefab_3' },
                { x: 260, y: 950, type: 'enemyPrefab_4' }
            ]
        };
        return levelData[levelKey] || [];
    }

    initLevel() {
        // 这里可以加载关卡数据，设置敌人的初始位置等
        this.spawnEnemies();
    }

    spawnEnemies() {
        const levelData = this.loadLevelData('level1'); // 默认加载第一关数据
        const enemyManager = EnemyManager.getInstance(); // 获取 EnemyManager 的实例

        levelData.forEach(data => {
            const enemyPrefab = this.getEnemyPrefab(data.type);
            if (enemyPrefab) {
                const enemy = instantiate(enemyPrefab);
                enemy.setParent(this.node); // 将敌人添加到某个父节点下
                enemy.setPosition(data.x, data.y, 0); // 设置敌人的位置
                enemyManager.enemyArray.push(enemy); // 将新生成的敌人添加到 EnemyManager 的敌人数组中
            }
        });
    }
    getEnemyPrefab(type: string): Prefab | null {
        switch (type) {
            case 'enemyPrefab_0':
                return this.enemyPrefab_0;
            case 'enemyPrefab_1':
                return this.enemyPrefab_1;
            case 'enemyPrefab_2':
                return this.enemyPrefab_2;
            case 'enemyPrefab_3':
                return this.enemyPrefab_3;
            case 'enemyPrefab_4':
                return this.enemyPrefab_4;
            default:
                return null;
        }
    }

    getSpawnPoints(): Node[] {
        const spawnPoints: Node[] = [];
        const maxTries = 10; // 最大尝试次数以避免无限循环

        for (let i = 0; i < 10; i++) { // 假设我们需要10个生成点
            let validPosition = false;
            let tries = 0;
            let spawnPoint: Node;

            while (!validPosition && tries < maxTries) {
                spawnPoint = new Node();
                // 设置X坐标在-260到260之间
                spawnPoint.setPosition(
                    Math.random() * 520 - 260, // 520是-260到260的区间长度
                    Math.random() * 100 + 850, // 设置Y坐标在850到950之间
                    0
                );
                validPosition = this.isPositionValid(spawnPoint);
                tries++;
            }

            if (validPosition) {
                this.node.addChild(spawnPoint);
                spawnPoints.push(spawnPoint);
            } else {
                console.warn('Failed to find a valid spawn point');
            }
        }
        return spawnPoints;
    }

    isPositionValid(node: Node): boolean {
        const tolerance = 20; // 定义重叠的容忍距离
        for (const spawnPoint of this.getSpawnPoints()) {
            if (Math.abs(node.position.x - spawnPoint.position.x) < tolerance &&
                Math.abs(node.position.y - spawnPoint.position.y) < tolerance) {
                return false; // 点重叠
            }
        }
        return true; // 点不重叠
    }
    setLevel(levelKey: string) {
        this.spawnEnemies(); // 清除当前关卡的敌人
        const levelData = this.loadLevelData(levelKey);
        // 根据加载的关卡数据生成敌人
        levelData.forEach(data => {
            // 生成敌人的逻辑...
        });
    }
    // -----------             getSpawnPoints()   -----------///   
    //     3. 从关卡数据中加载
    // 如果您的关卡设计存储在外部数据中（例如，JSON文件或其他格式），您可以从这些数据中加载敌人的生成位置。
    // getSpawnPoints(): Node[] {
    //     const spawnPoints: Node[] = [];
    //     // 假设您有一个关卡数据的数组，其中包含了敌人生成点的坐标
    //     const levelData = this.loadLevelData();
    //     levelData.forEach((posData) => {
    //         const spawnPoint = new Node();
    //         spawnPoint.setPosition(posData.x, posData.y, 0);
    //         this.node.addChild(spawnPoint);
    //         spawnPoints.push(spawnPoint);
    //     });
    //     return spawnPoints;
    // }

    // loadLevelData(): Array<{x: number, y: number}> {
    //     // 加载关卡数据的逻辑
    //     // 这里只是一个示例，您需要根据实际情况实现数据的加载
    //     return [
    //         { x: 100, y: 200 },
    //         { x: 300, y: 400 },
    //         // ... 更多的生成点数据
    //     ];
    // }
    //     1. 手动设置生成点
    // 如果您的关卡设计较为简单或者敌人的生成点是固定的，您可以手动在编辑器中创建节点，并在 getSpawnPoints 方法中返回这些节点的数组。

    // typescript
    // getSpawnPoints(): Node[] {
    //     // 手动创建的敌人生成位置节点
    //     return [
    //         this.node.getChildByName('SpawnPoint1'),
    //         this.node.getChildByName('SpawnPoint2'),
    //         // ... 更多的生成点
    //     ];
    // }
    //---------------------------------------------------------///
}